package com.zdp.feignclient;

import com.zdp.domain.dto.UserDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

/**
 * @author sesshomaru
 * @date 2021/10/6 23:02
 * feign是声明式的http请求工具，为了就是方便发起http请求，并规范http请求的书写格式(规避Ribbon的弊端)
 */
@FeignClient(name = "user-center", fallback = UserCenterFeignClientFallback.class, configuration = FeignConfiguration.class)
public interface UserCenterFeignClient {

    /**
     * feign最后会把请求拼接为 http://user-center/users/{id}
     * @param id
     * @return
     */
    @GetMapping("/users/{id}")
    UserDTO findById(@PathVariable("id") Integer id);
}

/**
 * 官网的书写格式，不过也可以单独将StockFeignClientFallback注册为一个Bean
 */
class FeignConfiguration{

    @Bean
    public UserCenterFeignClientFallback userCenterFeignClientFallback() {
        return new UserCenterFeignClientFallback();
    }
}

/**
 * 请求feign时sentinel的控制台显示GET:http://user-center/users/{id}，配置这个的限流或者降级规则
 * 发生限流或者降级都会走到这里
 * 只要调用远端接口发生异常都会进入这个重写的方法中
 *
 * 如果触发了降级，开启了熔断则请求feign不会再去调用远端服务，而是直接走到这个降级的处理方法中
 * 直到本次熔断时间到才会再次请求远端服务(http://user-center/users/{id})，如果成功则不关闭熔断
 */
class UserCenterFeignClientFallback implements UserCenterFeignClient{
    @Override
    public UserDTO findById(Integer id) {
        return UserDTO.builder().wxNickname("限流或降级时的默认用户名").build();
    }
}
